#ifndef __TERMINAL_H__
#define __TERMINAL_H__

/*
 * 文件介绍
 * terminal.h 和 terminal.cpp 用作字符终端界面操作函数声明和实现
 *
 * 作者：李江军
 * 日期：2022-08-07
 * 功能：字符终端操作函数
 */

#include <iostream>
#include <string.h>

namespace CTUI
{

// 清屏光标不置顶
// #define CLEARSCREEN() printf("\033[2J")
// 清屏光标置顶
#define CLEARSCREEN() system("clear")

// 左移光标
#define MOVELEFT(y) printf("\033[%dD", (y))
// 光标右移
#define MOVERIGHT(y) printf("\033[%dC", (y))
// 上移光标
#define MOVEUP(x) printf("\033[%dA", (x))
// 下移光标
#define MOVEDOWN(x) printf("\033[%dB", (x))

// 定位光标
#define MOVETO(x,y) printf("\033[%d;%dH", (x), (y))

// 光标复位
#define RESET_CURSOR() printf("\033[H")

// 隐藏光标
#define HIDE_CURSOR() printf("\033[?25l")

// 显示光标
#define SHOW_CURSOR() printf("\033[?25h")

//反显
#define HIGHT_LIGHT() printf("\033[7m")
#define UN_HIGHT_LIGHT() printf("\033[27m")

    /*
     * 作者：李江军
     * 日期：2022-08-07
     *
     * 获取终端字符宽度
     */
    int terminalWidth();

    /*
     * 作者：李江军
     * 日期：2022-08-04
     *
     * 获取终端中心起点位置
     * 参数：字符串长度
     */
    int startCenterPosition(int len);

    /*
     * 作者：李江军
     * 日期：2022-08-06
     *
     * 字符串终端居中显示
     * 用于输出全部字符串，该项目中用来输出上下字符边框
     * 参数：
     * startPos：指定字符串显示起始位置
     * str：显示的字符串
     */
    void positionPrint(int startPos, const char *str);

    /*
     * 作者：李江军
     * 日期：2022-08-06
     *
     * 字符串终端居中显示
     * 用于输出全部字符串，该项目中用来输出上下字符边框
     * 参数：
     * startPos：指定字符串显示起始位置
     * str：显示的字符串
     */
    void positionPrint(int startPos, const std::string &str);

    /*
     * 作者：李江军
     * 日期：2022-08-04
     *
     * 字符串终端居中显示
     * 用于输出全部字符串，该项目中用来输出上下字符边框
     * 参数：显示的字符串
     */
    void centerPrint(const char *str);

    /*
     * 作者：李江军
     * 日期：2022-08-04
     *
     * 字符串终端居中显示
     * 用于输出全部字符串，该项目中用来输出上下字符边框
     * 参数：显示的字符串
     */
    void centerPrint(const std::string &str);

    /*
     * 作者：李江军
     * 日期：2022-08-09
     *
     * 终端显示字符串内容
     * 1. 通过计算字符串长度与边框宽度输出字符串，字符串默认靠左输出显示
     * 2. 当字符串超过字符边框是将自动换行输出
     * 3. 自动添加左右边框字符
     * 参数：
     *      startPos：输出起始位置，包含边框
     *      width：字符边框宽度
     *      borderStyle：边框字符
     *      str：输出内容
     */
    void borderPrint(int startPos, int width, char borderStyle, const char *str);

    /*
     * 作者：李江军
     * 日期：2022-08-09
     *
     * 终端显示字符串内容
     * 1. 通过计算字符串长度与边框宽度输出字符串，字符串默认靠左输出显示
     * 2. 当字符串超过字符边框是将自动换行输出
     * 3. 自动添加左右边框字符
     * 参数：
     *      startPos：输出起始位置，包含边框
     *      width：字符边框宽度
     *      borderStyle：边框字符
     *      str：输出内容
     */
    void borderPrint(int startPos, int width, char borderStyle, const std::string &str);
    
    /*
     * 作者：李江军
     * 日期：2022-08-09
     *
     * 终端显示字符串内容
     * 1. 通过计算字符串长度与边框宽度输出字符串，字符串默认居中输出显示
     * 2. 当字符串超过字符边框是将自动换行输出
     * 3. 自动添加左右边框字符
     * 参数：
     *      startPos：输出起始位置，包含边框
     *      width：字符边框宽度
     *      borderStyle：边框字符
     *      str：输出内容
     */
    void borderCenterPrint(int startPos, int width, char borderStyle, const char *str);

    /*
     * 作者：李江军
     * 日期：2022-08-09
     *
     * 终端显示字符串内容
     * 1. 通过计算字符串长度与边框宽度输出字符串，字符串默认居中输出显示
     * 2. 当字符串超过字符边框是将自动换行输出
     * 3. 自动添加左右边框字符
     * 参数：
     *      startPos：输出起始位置，包含边框
     *      width：字符边框宽度
     *      borderStyle：边框字符
     *      str：输出内容
     */
    void borderCenterPrint(int startPos, int width, char borderStyle, const std::string &str);

} // end of namespace CTUI

#endif //__SERVERUI_H__